/*
 * @Author: your name
 * @Date: 2020-08-16 11:14:51
 * @LastEditTime: 2020-08-16 13:14:54
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: \demo\day02\traning\test01\main.go
 */
package main

import (
	"errors"
	"fmt"
	"sync"
)

// 使用“面向对象”的思维方式编写一个学生信息管理系统。
// 学生有id、姓名、年龄、分数等信息
// 程序提供展示学生列表、添加学生、编辑学生信息、删除学生等功能

type student struct {
	ID    int
	Name  string
	Age   int
	Score float64
}

type Manger struct {
	L        sync.Mutex
	students []student
}

func NewStudent(name string, score float64, id, age int) *student {
	return &student{
		ID:    id,
		Name:  name,
		Age:   age,
		Score: score,
	}

}

// func (m Manger) Check(id int) (err error) {
// 	for _, v := range m.students {
// 		if v.ID == id {
// 			fmt.Println("已经存在")
// 			err = errors.New("已经存在")
// 		}
// 	}
// }

// 查询所有学生列表
func (m Manger) Query() {
	if len(m.students) <= 0 {
		fmt.Println("没有数据请添加数据....")
		return
	}
	for index, v := range m.students {
		fmt.Printf("学生信息:[%d]:<%d,%s,%d,%f> \n", index, v.ID, v.Name, v.Age, v.Score)
	}
}

// 添加学生
func (m *Manger) AddStudent(s student) error {
	for _, v := range m.students {

		if v.ID == s.ID {

			return errors.New("已经存在")
		}
	}
	m.students = append(m.students, s)
	return nil
}

// 删除学生
func (m *Manger) DelStudent(id int) {
	for index, v := range m.students {
		if v.ID == id {
			m.students = append(m.students[:index], m.students[index+1:]...)
			break
		}
	}
}

// 编辑学生
func (m *Manger) Update(id int, age int, name string, score float64) {
	for _, v := range m.students {
		if v.ID == id {
			m.L.Lock()
			switch {
			case id > 0:
				v.ID = id
				fallthrough
			case age > 0:
				v.Age = age
				fallthrough
			case len(name) > 0:
				v.Name = name
				fallthrough
			case score > 0:
				v.Score = score
			}
			m.DelStudent(id)
			m.AddStudent(v)
			m.L.Unlock()
			break

		}
	}
}

var m Manger

func StudentAction(id int) {
	var (
		num   int
		name  string
		age   int
		score float64
	)
	switch id {
	case 1:
		fmt.Printf("正在查询中.....\n")
		m.Query()
	case 2:
		fmt.Printf("请输入添加学生的信息如下:\n")
		fmt.Println("请输入添加学生的信息ID:")
		fmt.Scanln(&num)

		fmt.Println("请输入添加学生的信息姓名:")
		fmt.Scanln(&name)
		fmt.Println("请输入添加学生的信age:")

		fmt.Scanln(&age)
		fmt.Println("请输入添加学生的信息分数:")

		fmt.Scanln(&score)
		err := m.AddStudent(*NewStudent(name, score, num, age))
		if err != nil {
			fmt.Println(err)
		}

	case 3:
		fmt.Printf("请输入修改学生的信息如下:\n")
		fmt.Println("请输入修改学生的信息ID:")
		fmt.Scanln(&num)

		fmt.Println("请输入修改学生的信息姓名:")
		fmt.Scanln(&name)
		fmt.Println("请输入修改学生的信age:")

		fmt.Scanln(&age)
		fmt.Println("请输入修改学生的信息分数:")

		fmt.Scanln(&score)
		m.Update(num, age, name, score)
		m.Query()

	case 4:
		fmt.Printf("请输入要删除学生的学号:\n")
		fmt.Scanln(&id)
		m.DelStudent(id)

	}
}

func main() {

	var id int
	for {
		fmt.Println(
			"***************学生管理系统************\n",
			"1.查询所有学生\n",
			"2.添加学生\n",
			"3.修改学生信息\n",
			"4.删除某个学生\n",
			"***************************************\n")
		fmt.Println("请输入编号:")
		fmt.Scanln(&id)
		StudentAction(id)
	}
	// var m Manger
	// // m.Query()

	// // 增加
	// s := NewStudent("万物", 123.3, 000001, 18)
	// s1 := NewStudent("小王", 32.2, 000002, 54)
	// s2 := NewStudent("张三", 0, 000001, 0)

	// m.AddStudent(*s)
	// m.AddStudent(*s1)
	// m.AddStudent(*s2)

	// // m.Query()
	// // 删除
	// // m.DelStudent(1)
	// // m.Query()
	// // 更新
	// // m.DelStudent(2)
	// m.Update(1, 21, "你是谁", 175.0)
	// m.Query()
}
